package la.iok.hzsvn.lewin.movie.mapper;

import la.iok.hzsvn.lewin.movie.core.movieservice.param.MovieVersionListParam;
import la.iok.hzsvn.lewin.movie.entity.MovieInstance;
import la.iok.hzsvn.lewin.mybatis.mapper.BaseMapper;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.List;

public interface MovieInstanceMapper extends BaseMapper<MovieInstance> {

    /**
     * 搜索剧本
     * @param orderColumn 排序字段
     * @param order 排序规则,值为ASC或者DESC
     * @param name 剧本名称，模糊查询
     * @param author 剧本作者,模糊查询
     * @param tag 剧本标签,模糊查询
     * @param minPlayers 最小玩家数量
     * @param maxPlayers 最大玩家数量
     * @param minDuration 最小开本时长
     * @param maxDuration 最大开本时长
     * @param movieLevelId 剧本类别id
     * @param status 剧本状态
     * @param excludes 需要排除的剧本id。是剧本id不是剧本实例id
     * @param innerTestIds 内测的剧本id.此时不管状态是什么都返回。id是剧本id不是实例id
     * @return 查询的剧本列表
     */
    List<MovieInstance> list(String orderColumn, String order,String name, String author, String tag,
                             Integer minPlayers, Integer maxPlayers, Integer minDuration, Integer maxDuration,
                             Long movieLevelId,Integer status,Long[] excludes,Long[] innerTestIds);

    /**
     * 最近的剧本实例
     * @param movieId 剧本id
     * @return 剧本实例
     */
    MovieInstance mostRecent(@NotNull Long movieId);

    /**
     * 查询最近剧本实例列表
     * @param movieIds 剧本id列表
     * @return 剧本实例列表
     */
    List<MovieInstance> mostRecentList(Long[] movieIds);

    /**
     * 剧本的所有实例上线
     * @param movieId 剧本id
     */
    void online(@NotNull Long movieId);

    /**
     * 剧本的所有实例下线
     * @param movieId 剧本id
     */
    void offline(@NotNull Long movieId);

    /**
     * 统计剧本的数量
     * @param status 剧本状态.为null则表示所有状态
     * @return 剧本数量
     */
    int count(@Nullable Integer status);

    @Nullable
    MovieInstance movieInst(@NotNull Long movieId, @NotNull String version);

    /**
     * 查询剧本的发布实例
     * @param movieId 剧本id
     * @return 剧本发布实例集合
     */
    List<MovieInstance> listPublishes(@NotNull Long movieId);

    int markFileDeleted(@NotNull Long id);

    /**
     * 删除剧本实例，需要先删除剧本的文件
     * @param id 剧本实例id
     * @return 受影响记录数,应该是1
     */
    int deleteInstance(Long id);

    List<MovieInstance> listByParam(String order, String orderColumn, MovieVersionListParam listParam);
}
